package io.aicn.lowcode.mapper.dbmanager;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import io.aicn.lowcode.entity.dbmanager.TableColumn;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;

import java.util.List;

/**
 * 表字段信息Mapper接口
 * 
 * @author lowcode-generator
 * @since 2025-01-25
 */
@Mapper
public interface TableColumnMapper extends BaseMapper<TableColumn> {

    /**
     * 根据表ID查询字段列表
     * 
     * @param tableId 表ID
     * @return 字段列表
     */
    @Select("SELECT * FROM dbm_table_column WHERE table_id = #{tableId} ORDER BY ordinal_position")
    List<TableColumn> selectByTableId(@Param("tableId") Long tableId);

    /**
     * 根据表ID查询主键字段
     * 
     * @param tableId 表ID
     * @return 主键字段列表
     */
    @Select("SELECT * FROM dbm_table_column WHERE table_id = #{tableId} AND is_primary_key = 1 ORDER BY ordinal_position")
    List<TableColumn> selectPrimaryKeysByTableId(@Param("tableId") Long tableId);

    /**
     * 根据表ID和字段名查询字段
     * 
     * @param tableId 表ID
     * @param columnName 字段名
     * @return 字段信息
     */
    @Select("SELECT * FROM dbm_table_column WHERE table_id = #{tableId} AND column_name = #{columnName}")
    TableColumn selectByTableIdAndColumnName(@Param("tableId") Long tableId, @Param("columnName") String columnName);

    /**
     * 根据数据域ID查询字段列表
     * 
     * @param domainId 数据域ID
     * @return 字段列表
     */
    @Select("SELECT * FROM dbm_table_column WHERE domain_id = #{domainId} ORDER BY create_time DESC")
    List<TableColumn> selectByDomainId(@Param("domainId") Long domainId);

    /**
     * 统计表的字段数量
     * 
     * @param tableId 表ID
     * @return 字段数量
     */
    @Select("SELECT COUNT(*) FROM dbm_table_column WHERE table_id = #{tableId}")
    int countByTableId(@Param("tableId") Long tableId);

    /**
     * 根据字段类型查询字段列表
     * 
     * @param tableId 表ID
     * @param columnType 字段类型
     * @return 字段列表
     */
    @Select("SELECT * FROM dbm_table_column WHERE table_id = #{tableId} AND column_type = #{columnType} ORDER BY ordinal_position")
    List<TableColumn> selectByTableIdAndColumnType(@Param("tableId") Long tableId, @Param("columnType") String columnType);
}